#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 递归调用，求n的阶乘
int factorial(size_t n) {
    // 递归出口（递归终止条件）
    if (n == 1) {
        return 1;
    }
    return n * factorial(n-1);
}

int sum(size_t n) {
    if (n == 1) {
        return 1;
    }
    return n + sum(n-1);
}

void foo(char * s) {
    char tmp;
    if (*s != '\0') {
        tmp = *s++; // 等价于：tmp = *s; s++;
        foo(s); // 递归调用 foo，传入指向下一个字符的指针
        if (tmp != '\0') {
            printf("%c", tmp);
        }
        // 在递归中，每次函数调用都会压入调用栈，直到遇到终止条件
        // 然后函数开始从栈顶逐个返回，即后入栈的先出栈
        // 所以最后一次递归调用的结果先打印
    }
}

int main() {
    int res = factorial(5);
    printf("res = %d\n", res);

    res = sum(5);
    printf("res = %d\n", res);

    char * str = "hello";
    foo(str);

    return 0;
}